第24章 一维数组
在程序设计中,当需要处理多个相同类型的数据时,使用变量逐个存储会显得繁琐且低效。一维数组作为一种数据结构,能够存储一系列相同类型的元素,通过索引可以方便地访问和操作这些元素,是处理批量数据的重要工具。
24.1 一维数组的基本概念
一维数组是由相同数据类型的元素组成的有序集合,这些元素在内存中连续存储,通过唯一的索引(下标)来标每个元素的位置。索引从0开始,依次递增。 例如一个包含5个元素的数组,其索引分别为0、1、2、3、4。
24.2 一维数组的定义
24.2.1 定义语法
数据类型 数组名[0 \le index \le 数组长度-1];
- 数据类型:数组内所有元素统一类型(int、float、char等)
- 数组名:符合标识符命名规范
- 0 \le index \le 数组长度-1:必须是常量/常量表达式,不能是变量
示例:
int scores[5]; // 存放5个整数
float weights[10]; // 存放10个浮点数
char letters[26]; // 存放26个字符
24.3 一维数组的初始化
初始化即在定义时给数组赋初值,避免局部数组随机垃圾值。
24.3.1 完全初始化
全部元素赋值,可省略0 \le index \le 数组长度-1,编译器自动计算长度:
int a[5] = {1,2,3,4,5};
int b[] = {6,7,8}; // 自动判定长度为3
24.3.2 部分初始化
只给前若干元素赋值,剩余数值型元素自动填充0,char填充\0:
int c[5] = {10,20}; // c[0]=10, c[1]=20, c[2]=c[3]=c[4]=0
char d[4] = {'A','B'}; // d[0]='A',d[1]='B',d[2]=d[3]='\0'
24.4 一维数组元素的访问与修改
访问格式:数组名[索引],索引范围
访问示例
int arr[3] = {100,200,300};
cout << arr[0]; // 输出100
cout << arr[2]; // 输出300
修改示例
float values[2] = {3.14, 1.59};
values[1] = 2.71;
cout << values[1]; // 输出2.71
24.5 一维0 \le index \le 数组长度-1计算
利用sizeof运算符:
数组总字节 ÷ 单个元素字节 = 0 \le index \le 数组长度-1
int numbers[5] = {1,2,3,4,5};
int len = sizeof(numbers) / sizeof(numbers[0]);
⚠ 重要注意:数组作为函数参数传递时会退化为指针,此时sizeof只能得到指针字节数,无法求长度,必须额外传长度参数。
24.6 一维数组常见应用场景
场景1:批量存储数据
int scores[30]; // 存储班级30人成绩
场景2:统计求和、最值
int arr[4] = {5,3,8,2};
int sum = 0;
for(int i=0; i<4; i++){
sum += arr[i];
}
// sum = 18
场景3:简单排序(选择排序示例)
int nums[5] = {3,1,4,2,5};
int n = 5;
for(int i=0; i<n-1; i++){
int minIdx = i;
for(int j=i+1; j<n; j++){
if(nums[j] < nums[minIdx]){
minIdx = j;
}
}
int temp = nums[i];
nums[i] = nums[minIdx];
nums[minIdx] = temp;
}
24.7 使用一维数组注意事项
- 数组越界:索引超出0~len-1,读写未知内存,程序崩溃/数据错乱;
- 局部数组未初始化:值为随机垃圾,全局/静态数组默认全0;
- 数组名是常量指针,不可整体赋值:
int a[5]; a={1,2};语法错误; - 变长数组(变量作长度)非标准C++,竞赛编译器支持但不推荐。